#ifndef STUDENT_H_
#define STUDENT_H_

#include <iosfwd>
#include <vector>
#include <string>
#include <boost/shared_ptr.hpp>

#include "schedule.h"
#include "curriculum.h"
#include "constraint.h"

class Course;

/// Student information management.
class Student {
    int studentID;
    Schedule currentSched;
    std::vector<boost::shared_ptr<Course> > completedCourses;
    std::string firstName;
    std::string lastName;
    std::string passHash;
    std::string curriculumFile;
    std::size_t courseCount;

    // vector <Schedule> pastSchedules; // To be added later	
    boost::shared_ptr<Constraint> constraints;
    
public:
    Student( int studentID, const std::string& first, const std::string& last);
    Student();
    ~Student();
    Schedule getCurrSchedule() const;
    // Schedule getSchedule(int timePeriod); Later feature
    std::vector< boost::shared_ptr<Course> > getCompletedCourses() const;
    bool isTaken(Course * queryCourse) const;
    bool isRequired(Course * queryCourse) const;
    // void archiveSchedule(); // Later Feature
    void addCompletedCourse(boost::shared_ptr<Course> course);
    
    // Setters
    bool setFirstName ( const std::string& name );
    bool setLastName ( const std::string& name );
    bool setStudentID ( int id );
    bool setStudentID ( const std::string& id );
    bool setPassword ( const std::string& pass );
    bool setCurriculumFile( const std::string& curr );
    void setConstraints(boost::shared_ptr<Constraint> newConstraints);
    void setCourseCount(std::size_t newCourseCount);

    // Getters
    std::string getFirstName () const;
    std::string getLastName () const;
    int getStudentID () const;
    bool isCorrectPassword( const std::string& pass ) const;
    std::string getCurriculumFile( ) const;
    boost::shared_ptr<Constraint> getConstraints() const;
    std::size_t getCourseCount() const;
};

std::ostream& operator<<(std::ostream& output, const Student& s);

#endif
